'''
线程：cpu调度的基本单位，就是一个进程里有多个线程 程序>进程>线程
线程在同一个进程下数据共享
    setDeamon() 设置守护线程
    isDeamon()  是否是守护线程
'''
import threading
from threading import Thread,Lock
import time
def do(): # 两次循环
    time.sleep(1)
    for i in range(2):
        print(f"{threading.current_thread()}在执行{i}")

lst = [Thread(target=do) for i in range(3)] # 三个线程
start = time.time()
for i in lst:
    i.start()
for i in lst:
    i.join()
print("结束执行，耗时",time.time() - start) # 执行结束，发现每次print都是不同顺序不同线程执行的，说明线程并发由cpu调度决定
# 一共四个线程 1个主线程 3个子线程
'''
继承创建线程，创建方式同进程，class(Thread): __init__(self) super().__init__(),实现run方法
'''
class MyThread(Thread):
    def __init__(self,name):
        super().__init__()
        self.name = name
    
    def run(self):
        print(f"子线程执行：{self.name}")

t1 = MyThread('继承线程1')
t1.start()

'''
多个线程操作一个数据存在数据不安全问题
使用lock加锁解决
    threading Lock
    lock = Lock()
    lock.acquire() 加锁
    lock.release() 释放
'''
tickets = 50
lock = Lock()
def sale_ticket():
    lock.acquire() # 加锁
    global tickets
    while tickets > 0:
        tickets -=1
        print(f"{threading.current_thread().getName()}卖票 剩余{tickets}张")
    lock.release() # 释放锁
    
lst = [Thread(target=sale_ticket,name=i) for i in range(5)]
for i in lst:
    i.start()
for i in lst:
    i.join()